{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "580f746f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "11800 1878285.9 30085 2470720 6436520 458 24\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "明细 = pd.read_excel(\"E:\\python_new\\商业数据分析\\《Power BI商业数据分析项目实战》\\第4篇 货品案例10 11 12 13 14\\第10章\\数据源.xlsx\")\n",
    "# 计算销售数量\n",
    "销售数量 = 明细['销量'].sum()\n",
    "销售金额 = 明细['销售额'].sum()\n",
    "库存量 = 明细['库存数量'].sum()\n",
    "销售零售额 = (明细['销量'] * 明细['零售价']).sum()\n",
    "库存金额 = (明细['库存数量'] * 明细['零售价']).sum()\n",
    "款式数量 = 明细[明细['库存数量'] > 0]['货号'].nunique()\n",
    "零星款式数量 = 明细[(明细['库存数量'] > 0) & (明细['库存数量'] < 6)]['货号'].nunique()\n",
    "print(销售数量, 销售金额, 库存量, 销售零售额, 库存金额, 款式数量, 零星款式数量)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "a0bfd186",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>货龄</th>\n",
       "      <th>货龄区间</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>186</td>\n",
       "      <td>120天以上</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>186</td>\n",
       "      <td>120天以上</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>186</td>\n",
       "      <td>120天以上</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>186</td>\n",
       "      <td>120天以上</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>186</td>\n",
       "      <td>120天以上</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>186</td>\n",
       "      <td>120天以上</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>186</td>\n",
       "      <td>120天以上</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>186</td>\n",
       "      <td>120天以上</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>186</td>\n",
       "      <td>120天以上</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>186</td>\n",
       "      <td>120天以上</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    货龄    货龄区间\n",
       "0  186  120天以上\n",
       "1  186  120天以上\n",
       "2  186  120天以上\n",
       "3  186  120天以上\n",
       "4  186  120天以上\n",
       "5  186  120天以上\n",
       "6  186  120天以上\n",
       "7  186  120天以上\n",
       "8  186  120天以上\n",
       "9  186  120天以上"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from datetime import datetime\n",
    "# 定义一个函数来计算货龄区间\n",
    "def 计算货龄区间(货龄):\n",
    "    if 货龄 <= 30:\n",
    "        return \"30天以下\"\n",
    "    elif 货龄 <= 60:\n",
    "        return \"30-60天\"\n",
    "    elif 货龄 <= 90:\n",
    "        return \"60-90天\"\n",
    "    elif 货龄 <= 120:\n",
    "        return \"90-120天\"\n",
    "    else:\n",
    "        return \"120天以上\"\n",
    "# 将上市日期列转换为datetime类型（如果它还不是）\n",
    "明细['上市日期'] = pd.to_datetime(明细['上市日期'])\n",
    "# 计算货龄\n",
    "明细['货龄'] = (明细['上市日期'] - datetime(2017, 6, 30)).dt.days + 1\n",
    "# 应用货龄区间函数\n",
    "明细['货龄区间'] = 明细['货龄'].apply(计算货龄区间)\n",
    "明细[['货龄', '货龄区间']].head(10) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "3bd50a33",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>货号</th>\n",
       "      <th>销售折扣</th>\n",
       "      <th>毛利率</th>\n",
       "      <th>存销比</th>\n",
       "      <th>存销比背景色</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>STY0120</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>inf</td>\n",
       "      <td>Red</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>STY0121</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>inf</td>\n",
       "      <td>Red</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>STY0122</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Red</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>STY0123</td>\n",
       "      <td>91.0</td>\n",
       "      <td>56.0</td>\n",
       "      <td>6.2</td>\n",
       "      <td>Red</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>STY0124</td>\n",
       "      <td>39.0</td>\n",
       "      <td>-1.0</td>\n",
       "      <td>6.7</td>\n",
       "      <td>Red</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>578</th>\n",
       "      <td>STY0616</td>\n",
       "      <td>73.0</td>\n",
       "      <td>45.0</td>\n",
       "      <td>10.4</td>\n",
       "      <td>Red</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>579</th>\n",
       "      <td>STY0617</td>\n",
       "      <td>73.0</td>\n",
       "      <td>45.0</td>\n",
       "      <td>4.8</td>\n",
       "      <td>Red</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>580</th>\n",
       "      <td>STY0618</td>\n",
       "      <td>95.0</td>\n",
       "      <td>58.0</td>\n",
       "      <td>1.7</td>\n",
       "      <td>Green</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>581</th>\n",
       "      <td>STY0624</td>\n",
       "      <td>73.0</td>\n",
       "      <td>45.0</td>\n",
       "      <td>3.2</td>\n",
       "      <td>Yellow</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>582</th>\n",
       "      <td>STY0625</td>\n",
       "      <td>73.0</td>\n",
       "      <td>45.0</td>\n",
       "      <td>3.7</td>\n",
       "      <td>Yellow</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>583 rows × 5 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "          货号  销售折扣   毛利率   存销比  存销比背景色\n",
       "0    STY0120   NaN   NaN   inf     Red\n",
       "1    STY0121   NaN   NaN   inf     Red\n",
       "2    STY0122   NaN   NaN   NaN     Red\n",
       "3    STY0123  91.0  56.0   6.2     Red\n",
       "4    STY0124  39.0  -1.0   6.7     Red\n",
       "..       ...   ...   ...   ...     ...\n",
       "578  STY0616  73.0  45.0  10.4     Red\n",
       "579  STY0617  73.0  45.0   4.8     Red\n",
       "580  STY0618  95.0  58.0   1.7   Green\n",
       "581  STY0624  73.0  45.0   3.2  Yellow\n",
       "582  STY0625  73.0  45.0   3.7  Yellow\n",
       "\n",
       "[583 rows x 5 columns]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 定义函数来计算存销比背景色\n",
    "def 计算存销比背景色(存销比):\n",
    "    if 存销比 <= 2:\n",
    "        return \"Green\"\n",
    "    elif 存销比 <= 4:\n",
    "        return \"Yellow\"\n",
    "    else:\n",
    "        return \"Red\"\n",
    "明细['销售额'] = pd.to_numeric(明细['销售额'], errors='coerce')\n",
    "明细['零售价'] = pd.to_numeric(明细['零售价'], errors='coerce')\n",
    "明细['销量'] = pd.to_numeric(明细['销量'], errors='coerce')\n",
    "明细['库存数量'] = pd.to_numeric(明细['库存数量'], errors='coerce')\n",
    "# 销售折扣（百分比形式，小数位数为0）\n",
    "明细['销售折扣'] = (明细['销售额'] / (明细['销量'] * 明细['零售价'])) * 100\n",
    "# 毛利率（百分比形式，小数位数为0）\n",
    "明细['毛利率'] = ((明细['销售折扣'] / 100 - 0.4) / (明细['销售折扣'] / 100)) * 100\n",
    "# 存销比（小数形式，小数位数为1）\n",
    "明细['存销比'] = 明细['库存数量'] / 明细['销量']\n",
    "# 应用存销比背景色函数\n",
    "明细['存销比背景色'] = 明细['存销比'].apply(计算存销比背景色)\n",
    "# 四舍五入到指定的小数位数\n",
    "明细['销售折扣'] = 明细['销售折扣'].round(0)\n",
    "明细['毛利率'] = 明细['毛利率'].round(0)\n",
    "明细['存销比'] = 明细['存销比'].round(1)\n",
    "明细[['货号', '销售折扣', '毛利率', '存销比', '存销比背景色']]  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "fa4d55d6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>货号</th>\n",
       "      <th>类别</th>\n",
       "      <th>上下装</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>STY0120</td>\n",
       "      <td>夹克</td>\n",
       "      <td>上装</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>STY0121</td>\n",
       "      <td>夹克</td>\n",
       "      <td>上装</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>STY0122</td>\n",
       "      <td>牛仔长裤</td>\n",
       "      <td>下装</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>STY0123</td>\n",
       "      <td>长袖衬衫</td>\n",
       "      <td>上装</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>STY0124</td>\n",
       "      <td>长袖衬衫</td>\n",
       "      <td>上装</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        货号    类别 上下装\n",
       "0  STY0120    夹克  上装\n",
       "1  STY0121    夹克  上装\n",
       "2  STY0122  牛仔长裤  下装\n",
       "3  STY0123  长袖衬衫  上装\n",
       "4  STY0124  长袖衬衫  上装"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 定义函数来计算上下装\n",
    "def 计算上下装(类别):\n",
    "    if \"裤\" in 类别 or \"裙\" in 类别:\n",
    "        return \"下装\"\n",
    "    else:\n",
    "        return \"上装\"\n",
    "# 应用上下装函数\n",
    "明细['上下装'] = 明细['类别'].apply(计算上下装)\n",
    "明细[['货号', '类别', '上下装']].head()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "c58ebf1c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>货号</th>\n",
       "      <th>销售额</th>\n",
       "      <th>累计销售额</th>\n",
       "      <th>累计占比</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>384</th>\n",
       "      <td>STY0388</td>\n",
       "      <td>63111.0</td>\n",
       "      <td>63111.0</td>\n",
       "      <td>3.360032</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>517</th>\n",
       "      <td>STY0521</td>\n",
       "      <td>56849.3</td>\n",
       "      <td>119960.3</td>\n",
       "      <td>6.386690</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>483</th>\n",
       "      <td>STY0487</td>\n",
       "      <td>39337.0</td>\n",
       "      <td>159297.3</td>\n",
       "      <td>8.480993</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>429</th>\n",
       "      <td>STY0433</td>\n",
       "      <td>36608.0</td>\n",
       "      <td>195905.3</td>\n",
       "      <td>10.430004</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>479</th>\n",
       "      <td>STY0483</td>\n",
       "      <td>36203.0</td>\n",
       "      <td>232108.3</td>\n",
       "      <td>12.357453</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          货号      销售额     累计销售额       累计占比\n",
       "384  STY0388  63111.0   63111.0   3.360032\n",
       "517  STY0521  56849.3  119960.3   6.386690\n",
       "483  STY0487  39337.0  159297.3   8.480993\n",
       "429  STY0433  36608.0  195905.3  10.430004\n",
       "479  STY0483  36203.0  232108.3  12.357453"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 新建度量值\n",
    "# 计算销售金额总和\n",
    "总销售额 = 明细['销售额'].sum()\n",
    "# 按销售额降序排列并计算累计销售额\n",
    "明细 = 明细.sort_values(by='销售额', ascending=False)\n",
    "明细['累计销售额'] = 明细['销售额'].cumsum()\n",
    "# 计算累计占比\n",
    "明细['累计占比'] = (明细['累计销售额'] / 总销售额) * 100\n",
    "# 显示前几行结果以检查代码正确性\n",
    "明细[['货号', '销售额', '累计销售额', '累计占比']].head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "40c2ce1b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAcwAAAE5CAYAAAAdhBAsAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABS7klEQVR4nO3deVxU9frA8c8swICArG6AivsWrpjXUsutTb1a3TLslqalLbZolqaVWi55S23xurS4dc2692eLVpapaaVWqGCIu6KiIovsw+zn9wcyObE4IDgD87xfL15wznzPmecZhnn4nvM936NSFEVBCCGEEBVSuzoAIYQQojaQgimEEEI4QQqmEEII4QQpmEIIIYQTpGAKIYQQTpCCKYQQQjhBCqYQQgjhBCmYQgghhBOkYApRQ1auXElcXFyZjx0/fpxevXrxww8/XOeoqubQoUPs2rXLvnzgwAG++uorF0YkxPUnBVOIGpKVlcWZM2fKfGzfvn3s3buXLl26lPl406ZN8ff3JywszP6l0+nQ6XQO6wICAmjSpEmZ+/j666/p0qULGRkZ5caoKAqJiYksWbKEiib9euedd5gwYYJ9+ZNPPmH8+PHlti+RkpJCt27d2LNnj8P6p556iptvvhlFUbhw4QJms/mq+xLC1bSuDkCIukqr1aLT6RzW/fHHH+Tm5rJhwwZatmzJ4cOH7Y+1atWKRo0aAVCvXj1eeuklhyI1evRotFotH3zwgX3dqlWrmD17dpnPX1BQQGJioj2Gffv2cfbsWc6dO8fJkyc5cOAACQkJZGRkEB4eTkxMDH369ClzX35+fgQFBdmX69Wrh4+Pz1Vfg+XLl1NQUECHDh1KvTaFhYUoisJdd91Ft27dHPISwh1JwRSimgUGBmIymbBardhsNnvB2rlzJ9OnTyc1NZWIiAgiIyOZOXMmAHv37uXNN99k7NixAKjVahYsWMCqVavs+z1x4gQqlYpevXrZ12VkZKBWl32gSKst/vMuef65c+eyZ88e2rRpwy+//ML999/PmjVr6NSpE5GRkRXmpFKpyn2e8mRlZfHvf/+bjRs34u3tjcVisccUFBSEn58farWa1atX8/LLL5OXl0dgYGClnkOI60kKphDVTFEUNm/eTEJCAps2beKHH35ApVLh7e2NTqfjmWeeceg5Atxyyy14e3vbl202G5MmTWLcuHH2dY8++iharZalS5fa161du5Z58+Y57CslJQWtVktubi5QXFTNZjNr1qzBz88PgLCwMPr378/tt99eZg7jxo3jww8/tPciLRaLQ/G3Wq1YLJZSyxcvXqRBgwYAvPDCCwwfPpy+ffvy+uuvs2bNGn777Td7T9VqtXLx4kUuXrxIjx49GDp0KJMnT2bYsGGVe8GFuE6kYApRzco7VKnVatFoNOVup1Kp7D/r9Xpef/113nvvPfu6CxcuoFKp2L17t31dbm6uw3YAt99+O0eOHLEvR0REAPD777/To0cPp3LQ6XQ0a9aMlJQUAJ5//nni4+P58ccfAXj99df54IMP7I9/8MEHPProo/bc33nnHTZu3EhCQgIXL15k8eLFPPfcc3z55ZccOXKEL7/8kuTkZNq2bUuXLl2IiYnh3nvvpX379k7FJ4QryKAfIdzQ6dOnSUtLY8+ePQwYMICCggLef/99cnJyOHz4MHPmzKGoqIg5c+Zw/vx5h23j4+Mxm81s2LABKO7JGQwGunbtWu7zKYrCiRMn7MsVFfaKlGz32WefkZGRQdOmTYmKiiI6OpqpU6fyySefkJOTQ69evYiIiCAnJ4cff/yRd955h4kTJ1K/fv0KBx8J4UrSwxTCDSUmJrJ06VLWr1+P2WwmLi6Obdu2sXHjRg4ePEhKSgrjx4/n1ltvLbWtv78/8GePVa1Wc+TIEWJiYgAwGAzYbDa2bdtGQkICCQkJ7N+/H5vNRn5+vsO2VbVs2TJ8fHwIDg7mhhtuYMWKFWg0GjZv3gzApk2b+PTTT9m3b5998NH27dv5448/OHXqFM2aNbum5xeiJkjBFOI6mzhxIs8++6zDOpPJ5HC+0mw2k5CQwLBhw2jatCmXLl3i448/xtfXl8mTJzNq1Chmz57t1ECc/v37k56ezo033siWLVtITU1FURSOHj3KgAEDGD9+PJ06daJdu3YO250+fdp+jtKZc5hX6tSpEwBjxowhLi7O3rudN2+e/ZKawsJChg0bZj8kO23aNDp37kxUVFQlXk0hrh85JCvEdfbuu+9iMBgcvvr27evQpkePHuzevZtx48Zx6NAhNmzYwCuvvEJKSgovvPACVquVxMREOnbsWOoayry8PJYtW8b06dMBGDJkCHv37mXYsGG89957nDhxgtDQUCZMmMCcOXN44IEHuOGGG/Dy8nKIoVmzZvb4nn32Wfr27WtffvXVVx0ev3IgEhQPWpo/fz7bt2/npZdeIjU1lZSUFGw2G7feeisff/wxDRs2ZMWKFWzatImWLVvy/fffExkZWenRuEJcL9LDFKKa2Ww2h+WSw5zOFoItW7bw1ltvsXfvXjIzMwHo1q0ba9as4e233yYnJwcvLy9CQ0Pp1KkTkydP5vvvv+fLL78EoGfPnhiNRvr27UtycjKTJk0C4O9//3t1pehUDtOmTUOj0RAWFoafnx/PPvssc+bMsbe58cYb2bFjB15eXjz11FMMHz6coqIiAgICrlucQlSGFEwhqtlfZ62ZMGECffr0ITo62qntw8LCaNCgAU8++SSKotCpUyfCw8NZtmwZBoOBDRs2UFhYiK+vL1qtloSEBNLS0uzbr127lpiYGL799lvWrFlTrbk56+abb2bt2rV06tSJ5s2bO0x6UGLEiBE899xzLFq0iKeeeoqFCxde/0CFqAQ59iFENXvmmWdo2rSp/TDpf/7zH3bu3Imvry9QfA6zZJq7kq+dO3fat+/atStr1qyhRYsWLF68mB07dnDLLbfQqFEjtFotarWaF198kRYtWrBo0SLatGnjcD1lbGysU7PwXKmoqIiRI0dy8uRJgGseqVqvXj3i4uIIDg5m9+7dzJ49mzvvvJODBw8Cxb3w5ORkcnJy6NGjh71YlvTGhXBHUjCFqGavv/46LVq0wGQyYTKZHB4zGo3lnsMsGTize/du+vfvz4QJE3j++ed56623gOKBNyWjV9944w2efPJJ5s6dS4sWLUqdQwRKPfeV1Go1u3bt4syZM6SmpvLf//6XTz/9lKysLPtzlQz60el0LF68mJ07d9qXZ82a5fD4448/Dvx5OHrGjBnodDqaN2/OpEmTSE1N5Z577qFp06YcOHCAvn37snbtWl577TV+/fVXPvvsM2w2G507d2blypXX+BsQombIIVkhakhZBdNgMJTb3mAwoCgKb7zxBn5+fhw8eJDo6GgMBgOxsbEkJiYydepUAAICAnjxxRd57LHHePnllyksLLTvR1EUBg4cSEJCAiEhIWU+1+jRo3n77bd5//33AfD29uaee+4hNjYWKC7sV05ccDUlExcYDAYCAwMZM2YMDRs2ZOjQoTRv3hyAM2fOEBcXx9dff83tt99OQkICDRs2xM/Pj7i4OObMmcPp06crvF5UCFdSKXKVsBDXTVpaGvXq1atwYIvVai01ccCnn36Kj48PQ4YMsc/HWpG33nqLnJwc7r//fvslHu7g2WefpU+fPtxzzz0O69evX8+8efMYO3YsTz/9tIuiE6JiUjCFEEIIJ8g5TCGEEMIJUjCFEEIIJ0jBFEIIIZwgBVMIIYRwghRMIYQQwgkedR2mzWbj/PnzBAQEXPPti4QQQtROiqKQn59PkyZNKjXZv0cVzPPnz8utg4QQQgBw9uxZIiMjnW7vUQWz5GLxs2fPEhgYWKV9mM1mvv/+ewYPHlzqdkh1kaflC56Xs6flC56Xs6flCxXnnJeXR1RUVKXvjONRBbPkMGxgYOA1FUw/Pz8CAwM94o3nafmC5+XsafmC5+XsafmCczlX9tScDPoRQgghnCAFUwghhHCCFEwhhBDCCS4tmFlZWURHRzvcQigpKYnY2FiCg4OZMmWKw41sK3pMCCGEqEkuK5iZmZkMGTLEoVgajUaGDh1K9+7diY+PJzk5mVWrVl31MSGEEKKmuaxgjhw5kpEjRzqs+/bbb8nNzWXhwoW0bNmSuXPn8uGHH171MSGEEKKmueyykhUrVtCiRQueffZZ+7rExER69eqFn58fADExMSQnJ1/1MSGEqC1sNgWT1YbRbMNosWKy2jBbFSwl3202zPZ1yuWfbVhsyhXrbZhtxd+ttqufmrJarRw6ryLtl5RSNyevjTo0CaR3y7Dr/rwuK5gtWrQotS4vL4/o6Gj7skqlQqPRkJ2dXeFjwcHBZT6H0WjEaDQ67B+Kr88xm81Virtku6puX9t4Wr7geTl7Wr7gmLOiKJisCkUmK0VmK3qTlSKTFb3ZUvz98vrix20YLZcLncWG4Yplg9mGqeRnS0lBtGEqWbaULNtclLWGL04fddFzV6+HejUltmn9CttU9L6u6nvdrSYu0Gq1+Pj4OKzT6XTo9foKHyuvYM6bN49Zs2aVWv/999/be6pVtWXLlmvavrbxtHzB83KuTfkqChhtYLCAwVrypcJghSKL47LB+mc7o02FyVq8rcmq4cXftmGygg3XzC2tQkGrAo0aNKq/fKlBraL48ctfapWCVl3y85/fPY0t8xTffHPSqbZlva/1en2VntetCmZISAhJSUkO6/Lz8/H29q7wsfJMmzaNSZMm2ZdLpkMaPHjwNc30s2XLFgYNGuQRM2Z4Wr7geTm7Kl+TxUaewUyO3kxukZmcouLvuUUWcvRm+2P5Bgv5RgsFBgsFxuKfC40WnDgSWWleGhW+Xhp8vTX4lXz31tjX+Xpp0Hmp8dZq0GnV+JR8eWn+/FmrRnd52fuKn0vWe5f8rFWj1VyfYSSe9p6GinMuOdpYWW5VMGNjY/nggw/syykpKRiNRkJCQip8rDw+Pj6leqUAXl5e1/ymqY591Caeli94Xs7Xkq/FaiNbbyar0EhWgYnMguLvWYVGLhWayNEXF7+cIjN5RWZy9CYKTdZrjlmjVhGg0+LvoyVA50WAjxZ/nda+zl+nJVDnVfyzj5Z6Php8vbV4qxX2/babQbf2I9BPZy+MXtepgLmKp72noeycq/oauFXB7Nu3L7m5uaxZs4aHHnqI+fPnM3DgQDQaTYWPCSGqn6Io5BaZuZhn5GKegYt5BtLzjaTnGcgsKYqFJi4VmsjWm6jKZdEqFQTqvAjy8yLI14v6ft4E+TouB+i0BOqKC6L/FQUxwMcLnZe6SrfqM5vNpB+E6LB6HldARNW5VcHUarWsWLGCuLg4pkyZgtVqZceOHVd9TAhROQazlfM5RZzPMXA+u5CfzqnY+/VhMgtN9gKZnm+s1AAVlQpC/LwJ9fcmtJ4Pof7ehPn7EOznTXA9L+r7ehHkUBCLi6HaE0/CiVrJ5QXzr7P1DB8+nGPHjhEfH0/v3r0JDw936jEhRDFFUcgqNHEuu4jzOUWcu1wYz+XoiwtkThFZhaa/bKWBM2fK3F+wnxcNAnQ0CPShYaCOBgE+hAf4EOrvQ1g9b0L9i4tjsJ83Gil+og5zecEsS0REBBEREZV+TAhPYbUpXMgtIiVTT0pWIaezCknJ0pOSWciZS3qMTvQM/bw1NAnypUGAN+bcTLq2b0HjID8aBupoGOhDgwAd4QE+6LzktIcQ4KYFUwhRLLPAyLGLBRzPKCAls7D4K6uQs5eKMFnLL4oqFTQI8KFJkC9NgnyJvPy9+EtHRJAv9X29UKlUmM1mvvnmG+4c3EbO5wlRASmYQriYoihkFBg5frGAY+kFHL2Yz7H0Ao6nF3Cp1KHTP3lr1ESF+NI8tB7NQuvRPMzv8s9+NK7vi7e2bo/4FOJ6k4IpxHVktto4nl5A8vk8ki/kkXw+j0NpeeToy555RKWCqGA/WjXwp0VYPZqH1bMXxSZBvnLOUIjrSAqmEDXEZLFx6EIeCWdzOHg+l4Pn8zh2saDMQ6lqFTQLrUerBv60buBP64b+tG4QQMtwf3y95RyiEO5ACqYQ1SQ9z8C+MznsP5PNvjPZHEjNLXPwTYCPlvZNAunQOJAOl7+3auAvg2uEcHNSMIWooswCI7tPZLHrRCa7TmRxOqv0/JT1fb3o2jSImIj6l4tjfaJCfKt0sb0QwrWkYArhJIPZyu6TWfx0NJNdJzI5nJbv8LhKBW0bBtC1aTDdmgbRrVkwLcLqSXEUoo6QgilEBbILTWw7nM6W5IvsPJaB/i/zn7ZvHEjvlqHc1CqU2OYhBOjksgwh6iopmEL8RbbexM9pKv7z4e/En852uCtGo0Adt7YL56ZWYfytRSih/qUn9xdC1E1SMIWg+HDr1kPpfL7/HD8eScdi0wDZALRrFMDgDg0Z1KERnSIC5RCrEB5KCqbwaGcv6fn419N89vtZsq+4FjKynsKDfdpyV0wEUSHXdrNxIUTdIAVTeBybTWHnsQzW7j7NtiPp9ttSNa6vY0TXCIZ0asixvTu586bmMlWcEMJOCqbwGAazlf/tTeXDn09xKrPQvr5P6zD+2asZ/ds1QKtRYzabOebCOIUQ7kkKpqjzLhWaWLM7hTW7T9vnZg3Qabm3eyQP9mpGy3B/F0cohKgNpGCKOuvsJT0rdp7kv3vPYjAXz7gTGezLuJuj+UePKOr5yNtfCOE8+cQQdc7ZS3qWbD/O//amYrl8TcgNEfV5rG8L7ujUCK1G7uIhhKg8KZiizkjNLi6U/43/s1De3CqMJ25tyd9ahMrlIEKIayIFU9R6lwpNvLP1GP/59TRm65+F8tmBrenRPMTF0Qkh6gopmKLWMpitrN6Vwnvbj5NvsADQu2Uozw1qQ6wUSiFENZOCKWodm01h44HzLNh8hHM5RUDxnK4v3dmOPq3DXRydEKKukoIpapXfTl1iztfJJKbmAtAw0IfnB7fl7m6RaNRyjlIIUXOkYIpa4UJuEXO/OczGxPMA1PPWMKFfS8b1aYGvt9x4WQhR86RgCrdmtFj58OdTvLftOHqTFZUKRsY25blBrWkQoHN1eEIIDyIFU7it7YfTmb0p2T6NXfdmwcwa1pFOEfVdHJkQwhNJwRRu53RWIbM3JrP1cDoA4QE+TLujHSO6Rsi1lEIIl5GCKdyGxWpj+c6TvL31GCaLDa1axSM3RzOxfysCdHLXECGEa0nBFG7h0IU8pvwvkaRzeUDxxAMzh3WgVYMAF0cmhBDFpGAKlzJZbPz7x+Ms2X4cs1Whvq8Xrw7tIIdfhRBuRwqmcJkjafk8s34/h9PyARjcoSGvD+9Eg0AZ/SqEcD9SMMV1pygKq3elMPfbw5gsNkLqeTNrWEeGxDSWXqUQwm1JwRTXVUa+kef/m8iOoxkA3No2nAX3diY8wMfFkQkhRMWkYIrrZtvhi0z57wGyCk34aNVMv6s9/+zVTHqVQohawS3vpLt27VqaNm2Kv78/AwcOJCUlBYCkpCRiY2MJDg5mypQpKIri2kCFU0wWG7M2HuSRVfFkFZpo1yiAjRNv5qG/NZdiKYSoNdyuYJ44cYLp06fzxRdfkJycTLNmzRg9ejRGo5GhQ4fSvXt34uPjSU5OZtWqVa4OV1xFWq6BB97fw8pfUgB45KZovnjyJto0lMtFhBC1i9sdkt2/fz+9evWiW7duAIwZM4b77ruPb7/9ltzcXBYuXIifnx9z587lySefZMyYMZV/ksJC0JQxYbdGAzqdY7u/MpvRGAxQVAReXhW3LaFWg6/vn8t6PZTXO1apwM+vam2LisBmKz+OevWq1FZtMhXn51XO5AFX7tdgAKsVgD0nMpn830QuFZppoNMy7+4bGNA9ujhuAKMRLJbyY/Dzc76tr2/x6wxgMoHZXPW2Jb/jwkIICPjzvXK1/ep0f7Y1m4vbl8fHB7Tayre1WIpfi/J4e//5e6pMW6u14t+xl1dx+5K2BkP5+72yrc1W/F6rjrZabfFrAcV/E3p91dte+TvW6a7+d1/Cmc+IEn/9u3eXz4iK3mtV/Iy48u/+mttW5u++orZX/o69vEr/3VeF4mYOHjyohIaGKvv27VNycnKUkSNHKg899JAyc+ZM5Y477rC3s9lsSnBwcIX7MhgMSm5urv3r7NmzCqDkFr+9Sn1Z77hDMZlM9i+bn1+Z7RRQLH36OLYNCyu3rbV7d8e2zZqV29bWvr1j2/bty2/brJlDW2v37uW3DQtzbNu3b/lt/fzs7QoLC5ULFexXAcf93n13xW2zs/9s+89/Vtz23Dl7W8uECRW3PXr0z7aTJlXcdv/+P9vOmFFhW/OuXX+2nTev4rZbtvzZ9u23K277xRf2tuYPPqi47bp1f7Zdt67ith988GfbL76osK3l7bftv+OfXnut4rbz5v253127Km47Y8af74n9+ytuO2nSn22PHq247YQJf7Y9d67CttZ//vPPttnZFbe9+26H93CFbSvxGWHt29dtPiMKCwuVL774QrF061Z+2yp+RphMJsV6xx0Vvm7u9hlx6cknFUDJzc2tVH1yux5mhw4duPfee+09zOjoaH799Vfmz59PdHS0vZ1KpUKj0ZCdnU1wcHCZ+5o3bx6zZs1y+rnT09P59Ztv7Mt3Wa3ldsGzL13ilyva3m4yUd44z9zcXHZe0XaQXo9fOW3zCwrYfkXbWwsKCCynbZFez5Yr2vbNzaXsVwJMJhObr2h7U1YWYeW0tVqtfHNF2xvLaVfiyrbdLqQRVUHb7777Duvl/9C7pqbStIK2P/zwA6b69QGIOX2a6Arabt++naKGDQHocPIkrSto+9NPP5F/+jQAbY8do10FbX/55Rdy0ovntG11+DAdK2i7Z88esi73IqIPHiSmgrbx8fFcvPxzVGIi3Spou3//fs5f7iU02b+f2AraHkhM5Ozl30fD+Hh6VdD24MGDnLrcNrSCdgCHDx/m+OW2QceO0a+CtseOHePI5bYBZ87Qv4K2J0+eJPlyW9+LFxlcQdszp09z4HJb79xc7qigbWpqKvsvt9UYDAypoO2FtDTir3gP/72CtpX5jLiUleV2nxF5eXk18xmRnk6jctqC42dEj7Q0Iipoez0+I5peHhdTWSpFUZQqbVlD9uzZwz333MPnn39Ohw4dmDdvHt9//z39+/fHbDazcOFCe9uoqCj27NlDRETZL7/RaMR4xSGpvLw8oqKiyDx9msDAMt5iThxuMZvNbNu2jf4DB+J15T7c5XBLNR+SNZvNbP36awbccgteVzkkm55vZOKqPRxKzcVLo2LaHW25p2sTx4E91XW45a+q8ZCs/Xfcvz9eHnBI1mw2s2XzZgb16VP+77iOHZJ1+B17wCFZs9nMli1bGHTzzXiVdTqqRB06JOvwO/7LIdm8zEzCmjQhNze37FpQDrfrYX766aeMHDmSnj17AvD666+zbNky7r33XpKSkhza5ufn413yx1YGHx8ffHxK/0/nFRTkWOzKExRUep3ZjFWnwysw0PHDpay25bn8H1G1ty3vw+4a29q8vYtfswq2STqXy6Nr4rmQayQ4KIDl/+xBz+iQaovhurYt+R3/NefK7tevvD7CNba98oO1utpqNFf9HTvsV1eJ2ZjK+BuslrYV/O1ftW15v2Oo3N9yTbWtoc+IUp9bFTZ2079PZ9tW8Dv2urKAV4LbFUyLxUJ2drZ9OT8/n8LCQrRaLXv27LGvT0lJwWg0EhJylQ9lUeN2Hs1gwsd70ZustAyvx0ejY2kWWrU3pBBCuCu3u6zkpptuYsOGDSxatIh169YxfPhwGjZsyNNPP01ubi5r1qwBYP78+QwcOBBNRYcXRI3bmHiesat/R2+ycnOrMDY8cZMUSyFEneR2Pcz777+fI0eOsHjxYi5cuECnTp3YsGEDXl5erFixgri4OKZMmYLVamXHjh2uDtejrd1zmle+TEJRYEhMYxbe1wVvrdv9DyaEENXC7QqmSqXi1Vdf5dVXXy312PDhwzl27Bjx8fH07t2b8PBwF0QoFEXhna3HWfTDUQD+2asZM4d1RKOWWXuEEHWX2xXMq4mIiCh3VKyoeYqiMGtjMqt2pQDw9IDWPDewtUxxJ4So82pdwRSuoygKM786yOrdxdcwzhzagdE3VXTlkxBC1B1SMIVTSnqWq3efRqWCBffE8I8eFU1RIIQQdYsUTHFVigLzNh9l1a7inuUbd0uxFEJ4HimY4qo2nVXzw7niYjn/7hu4L1aKpRDC88g1AKJCK3ed5odzxW+TOSM6MbJnRTM7CiFE3SUFU5Try4RzzP32CADPD2rNqBubuTgiIYRwHSmYokw/Hcvg+f8mAtC3kY3H+jR3bUBCCOFicg5TlHIgNYcJa/ditirc1akRA/1T5TpLIYTHkx6mcJCSWciYlb9TaLJyU6tQ3rinEzKBjxBCSA9TXCFHb+KRVb+TVWiiU0Qgyx7sjo/MbS+EEID0MMVlJouNCR/v5WRmIRFBvnw0OpYAXSXuRSeEEHWcFEyBoijM+OIP9py8RD1vDR883IMGAZW4QbAQQngAKZiC5TtP8ll8KmoVvBfXjfaNA10dkhBCuB0pmB5uc1Ia8789DMDLQzpwa7sGLo5ICCHckxRMD3Y4LY9JnyUA8NDfmjG6d3OXxiOEEO6s0qNkbTYbZ86cIT09HX9/f6KioggICKiJ2EQNytGbeGzNXvQmK71bhvLKkA5yraUQQlTA6YJ5/Phx5syZw88//0x0dDRhYWHk5+eTkpJCaGgoEyZMYOTIkTUZq6gmVpvCxE/2c+aSnshgX96L64ZWIwcbhBCiIk4VzNmzZ/P5558ze/Zs3n//fbRax81OnjzJa6+9xtKlS/n0009p1KhRjQQrqseC7w7z07FMdF5qVvyzByH1vF0dkhBCuL2rFsx58+aRmprK77//XqpQlmjRogUrV65k48aN3HPPPfz8889yeM9NfZV4nuU7TgLwr3s706GJjIgVQghnXLVgvvDCC2g0zk33MnToUO68804plm7qeHo+L/7vAAAT+rVkaOcmLo5ICCFqj6ueuNJoNOj1egwGQ6nH3n77bVq0aEHLli1p0aIFc+bMcbq4iuuryGTlif/so8hs5eZWYUy5ra2rQxJCiFrFqXOYRUVFvP/++9hsNu69917atGkDwLvvvstrr71G7969+eOPPxg7dizTp0+v0YBF1bz6VRJHLxYQHuDDovu7oJEZ1YUQolKcKpihoaFMnToVk8nE//73Pz7++GO6dOnC8uXLWb58OatWrSIoKIiPP/64puMVVfD5/lQ+i09FpYK37+9CeICPq0MSQohax+nLSg4ePMjatWvJysoiICCAtLQ0kpKS6NmzJw888AARERE1GaeoouPpBUz/PAmAZwa0pnerMBdHJIQQtZPTBfOOO+5g+vTp3H777WRmZvLII49w4cIFbDYb69at4/z58/Tr14/+/fvXZLyiEkwWG8+s32+fnGBi/9auDkkIIWotpwvmXXfdxcKFC2ncuDFZWVn06dOHevXqATB+/HgADhw4UDNRiipZ/MNRDp7PI8jPS85bCiHENXK6YC5dupTCwkKys7MJCAigfv36pdrExMRUa3Ci6n5PucSyHScAmDfiBhoGyu26hBDiWlz1spIFCxYwb948AOrVq0dkZGSZxRJg37593HHHHSiKUr1RikrJN5iZ9FkCNgXu6RbJHTc0dnVIQghR6121YD777LMcO3aM2267jaSkpDLb6PV6Zs+ezejRo3nzzTdl4gIXe21TMmcvFRER5Murwzq4OhwhhKgTrnpI1tvbm48++oitW7fyxBNPUFBQQI8ePWjQoAH5+fmcOHGCo0eP8tBDD/Hbb7+h08mhP1fafjjdfgnJwvs6E6jzcnVIQghRJzh9DnPAgAEMGDCA9PR0/vjjDzIyMvD392fcuHHccMMNNRmjcFKh0cKML4qPAoy9KZobW4S6OCIhhKg7Kn0/zAYNGjBgwICaiKWUqVOncvDgQTZu3AhAUlISY8aM4fjx44wbN44FCxbI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JIRnk1GyQripF154gU2bNuHt7U1qaioajYbGjRtjs9koKiri8OHDaDQaWrZsSWFhITqdrsz9ZGZmMmHCBN588037ugULFjB27FiWLFlCeno606ZNY+XKlcyYMYMRI0bw6KOPcuedd5a5v7/97W8YDAbq169f6rGioiIyMjI4efJk9bwIQrgRrasDEEIUz237+OOPoygKWq2W6OhoNm/ezIIFCwC4//776d27d6lbsQF4e3uzfPlyBg4cWOa+H3zwQby8vBzWqdVqHn30UXr27ImXlxcfffQRFosFm83G9u3bmTt3brmx+vr6UlhYiMViKfWY1WrF19e3MqkLUWtIwRTCDQwaNIjjx4/Tq1cv5s+fzy233OLweFpamn3e279Sq69+ZuXKgpmdnU3z5s2xWCwcP36c7OxsrFYr7du3Z+fOnfj7+9O+fXuguABaLBaHuzxYrVaeeuopYmJiSj1Pamoq06dPdyZlIWodKZhCuKnc3Fw6d+6Mv78/Fy5c4KmnnsLLywu9Xs/27dtp1qwZUHwnkqu5sqjm5OSwadMmUlNT2bp1K126dCEsLIzff/+dP/74A71eT6tWrSgoKKCwsJDnn3+eV1991b59XFwcZ86c4cyZM2U+16OPPnqNmQvhnqRgCuGmtFotp0+f5q/DDJo3b26/60iJhx9+uNxDoRcvXmTy5Mn25ejoaF544QXuu+8+hg4dSmBgIKdOneL//u//6N69OwsWLGDcuHEsW7aMhIQEe7EcP348u3btIjAwsMLDrhaLhY8//phBgwbxr3/9q6rpC+F2pGAK4aY0Go3953feeYfU1FT7Oc0rHwNYvXp1hecwr/TDDz8wfvx4Pv74Y3755RcuXrxIly5dePrppzlx4gTHjx8H4MKFC0RERNi3W758OQArV66ksLCw3LjVajVPPPFEJTIVonaQy0qEqAUuXLhAfn5+teyrb9++7N69m4iICJYtW8Yrr7zC888/T8uWLZkyZQo///wzAKdOnaJt27altn/ttdcwm81ERkYSGRnJiy++SMOGDYmMjMTf358XX3yxWuIUwt1ID1MIN/Pxxx/z/vvv8+GHH9rXZWdn06VLl3K3qcwh2c8//5wpU6aQk5ODTqeja9euZGZmMmrUKN577z2aN2/OhQsX+Pnnn8scLatWq1mzZg316tUDwGg0snjxYlQqFWaz2alBSELURlIwhXADO3fuZPTo0RQWFtK1a1fi4uIwmUz2x3/++WfGjx9vXzabzQ7bV+aQ7P3338+IESPo2LEj3333HdHR0XTu3Jl//vOfqFQqHnzwQUaNGkX9+vWJjIwstb9evXrRsGFDe4GOj4+nb9++aDQaLBYLDRo0qPLrIIQ7k4IphBvo3LkzCxYs4O9//7v9EhCDwcC7777LsmXLqFevHjt37uS1117j1VdfLXPSgMo4cuQITZs25R//+AeNGjUCoFu3bkDxKNe5c+eyePHiUtvt2rWLY8eOkZKSYl9nsVjYuXOnfbSuyWTit99+o2fPntcUoxDuRmb6EcJNZWRkMH/+fL788ku2bduGVqvlgQceIDMzk6+//prmzZsD0L59e7Kzsyuc6ee5557jtddec1hvs9lYtGgRK1asoFu3buTk5LBy5UpGjhyJr68v+/btY/PmzXTt2tW+jV6vp7CwkLCwMHuBDAoKIi0tDZ1Oh6Io6PV6fHx8So3kFaK2k3e0EG7o+eefZ8mSJYwaNYq9e/fae5Rbt27lscce45lnnuHLL78EiiclWL9+fanJDko8+OCDGAwG+3J6ejrLly/n008/5eabb+bXX38lMDCQ+fPn07VrV1544QWee+453nvvPfr06cPSpUv55z//yaZNm5g5cyb+/v6lnuO2225zuB5Ur9czfvx4xo4dW42vihCuJT1MIdzQ6dOnKSwsLHN2H5vNhl6vL7NwOUNRFJYuXcqwYcMczlF++umnxMbG0qJFC/u6n376iZiYmGs+BCxEXSAFUwghhHCCjP8WQgghnCAFUwghhHCCFEwhhBDCCVIwhRBCCCdIwRRCCCGcIAVTCCGEcIIUTCGEEMIJUjCFEEIIJ/w/EDey5pNBy6cAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 500x300 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#绘制帕累图曲线\n",
    "import matplotlib.pyplot as plt\n",
    "plt.rcParams['font.sans-serif']=['SimHei']\n",
    "plt.rcParams['axes.unicode_minus']=False\n",
    "# 定义80%线\n",
    "八十百分比线 = 80\n",
    "# 绘制帕累托曲线\n",
    "plt.figure(figsize=(5, 3))\n",
    "# 绘制累计占比曲线\n",
    "plt.plot(range(1, len(明细['累计占比']) + 1), 明细['累计占比'], label='累计占比')\n",
    "# 绘制80%线\n",
    "plt.axhline(y=八十百分比线, color='r', linestyle='--', label='80%线')\n",
    "# 添加图例\n",
    "plt.legend()\n",
    "# 添加标题和轴标签\n",
    "plt.title('帕累托曲线')\n",
    "plt.xlabel('项目数量')\n",
    "plt.ylabel('累计占比 (%)')\n",
    "# 显示图表\n",
    "plt.grid(True)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "5a4e1600",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>货号</th>\n",
       "      <th>销售额</th>\n",
       "      <th>一步到位的累计占比</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>384</th>\n",
       "      <td>STY0388</td>\n",
       "      <td>63111.0</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>517</th>\n",
       "      <td>STY0521</td>\n",
       "      <td>56849.3</td>\n",
       "      <td>0.966400</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>483</th>\n",
       "      <td>STY0487</td>\n",
       "      <td>39337.0</td>\n",
       "      <td>0.936133</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>429</th>\n",
       "      <td>STY0433</td>\n",
       "      <td>36608.0</td>\n",
       "      <td>0.915190</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>479</th>\n",
       "      <td>STY0483</td>\n",
       "      <td>36203.0</td>\n",
       "      <td>0.895700</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          货号      销售额  一步到位的累计占比\n",
       "384  STY0388  63111.0   1.000000\n",
       "517  STY0521  56849.3   0.966400\n",
       "483  STY0487  39337.0   0.936133\n",
       "429  STY0433  36608.0   0.915190\n",
       "479  STY0483  36203.0   0.895700"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def 累计占比一步到位(row, 总销售额, 销售额列名='销售额'):\n",
    "    \"\"\"\n",
    "    计算累计占比的一步到位函数。\n",
    "    :param row: DataFrame中的一行\n",
    "    :param 总销售额: 所有项目的总销售额\n",
    "    :param 销售额列名: 销售额列的名称\n",
    "    :return: 累计占比\n",
    "    \"\"\"\n",
    "    累计销售额 = 明细[明细[销售额列名] <= row[销售额列名]][销售额列名].sum()\n",
    "    return 累计销售额 / 总销售额\n",
    "# 应用一步到位的累计占比函数\n",
    "明细['一步到位的累计占比'] = 明细.apply(lambda row: 累计占比一步到位(row, 总销售额=总销售额, 销售额列名='销售额'), axis=1)\n",
    "# 显示前几行结果以检查代码正确性\n",
    "明细[['货号', '销售额', '一步到位的累计占比']].head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "9f0e428b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(484, 97, 1370413.0, 0.7296083093633404)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 计算款式数量\n",
    "款式数量 = 明细[明细['销售额'] > 0]['货号'].nunique()\n",
    "# 计算20%款式数量\n",
    "_20_款式数量 = round(款式数量 * 0.2)\n",
    "# 计算前20%销售额\n",
    "前20_销售额 = 明细.nlargest(_20_款式数量, '销售额')['销售额'].sum()\n",
    "# 计算总销售额\n",
    "总销售额 = 明细['销售额'].sum()\n",
    "# 计算前20%销售占比\n",
    "前20_销售占比 = 前20_销售额 / 总销售额\n",
    "款式数量, _20_款式数量, 前20_销售额, 前20_销售占比"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
